Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

142 lines
4.8 KiB

namespace VRTK.Examples
{
using UnityEngine;
public class ToggleCustomHands : MonoBehaviour
{
public VRTK_ControllerEvents leftController;
public VRTK_ControllerEvents rightController;
public GameObject leftHandAvatar;
public GameObject rightHandAvatar;
protected bool state;
protected virtual void OnEnable()
{
state = false;
if (leftController != null)
{
leftController.ButtonTwoPressed += ToggleHands;
}
if (rightController != null)
{
rightController.ButtonTwoPressed += ToggleHands;
}
ToggleVisibility();
}
protected virtual void OnDisable()
{
if (leftController != null)
{
leftController.ButtonTwoPressed -= ToggleHands;
}
if (rightController != null)
{
rightController.ButtonTwoPressed -= ToggleHands;
}
}
protected virtual void ToggleHands(object sender, ControllerInteractionEventArgs e)
{
state = !state;
ToggleVisibility();
}
protected virtual void ToggleVisibility()
{
ToggleAvatarVisibility();
ToggleSDKVisibility();
ToggleScriptAlias();
}
protected virtual void ToggleAvatarVisibility()
{
if (leftHandAvatar != null)
{
leftHandAvatar.SetActive(state);
}
if (rightHandAvatar != null)
{
rightHandAvatar.SetActive(state);
}
}
protected virtual void ToggleSDKVisibility()
{
VRTK_SDKSetup sdkType = VRTK_SDKManager.GetLoadedSDKSetup();
if (sdkType != null)
{
VRTK_ControllerReference leftController = VRTK_ControllerReference.GetControllerReference(VRTK_DeviceFinder.GetControllerLeftHand(true));
VRTK_ControllerReference rightController = VRTK_ControllerReference.GetControllerReference(VRTK_DeviceFinder.GetControllerRightHand(true));
switch (sdkType.name)
{
case "SteamVR":
ToggleControllerRenderer(leftController.actual, "Model");
ToggleControllerRenderer(rightController.actual, "Model");
break;
case "Oculus":
ToggleControllerRenderer(leftController.model);
ToggleControllerRenderer(rightController.model);
break;
case "WindowsMR":
ToggleControllerRenderer(leftController.model, "glTFController");
ToggleControllerRenderer(rightController.model, "glTFController");
break;
}
}
}
protected virtual void ToggleControllerRenderer(GameObject controller, string findPath = "")
{
if (controller != null)
{
if (findPath == "")
{
controller.SetActive(!state);
}
else
{
Transform childModel = controller.transform.Find(findPath);
if (childModel != null)
{
childModel.gameObject.SetActive(!state);
}
}
}
}
protected virtual void ToggleScriptAlias()
{
GameObject scriptLeft = VRTK_DeviceFinder.GetControllerLeftHand(false);
GameObject scriptRight = VRTK_DeviceFinder.GetControllerRightHand(false);
CycleScriptAlias(scriptLeft, leftHandAvatar);
CycleScriptAlias(scriptRight, rightHandAvatar);
}
protected virtual void CycleScriptAlias(GameObject controller, GameObject avatar)
{
if (controller != null)
{
VRTK_InteractTouch touch = controller.GetComponentInChildren<VRTK_InteractTouch>();
VRTK_InteractGrab grab = controller.GetComponentInChildren<VRTK_InteractGrab>();
touch.enabled = false;
grab.enabled = false;
touch.customColliderContainer = null;
grab.ForceControllerAttachPoint(null);
if (avatar != null && state)
{
touch.customColliderContainer = avatar.transform.Find("HandColliders").gameObject;
grab.ForceControllerAttachPoint(avatar.transform.Find("GrabAttachPoint").GetComponent<Rigidbody>());
}
touch.enabled = true;
grab.enabled = true;
}
}
}
}